/** File to include all stimuli in this library
    Users could opt to include only specific stimuli instead.

    DCN 27-06-2010
*/

#pragma once

//// worlds
// dot
#include "StimDotCloud.h"
#include "StimDotCloudUniform.h"
#include "StimDotGround.h"
#include "StimDotGroundUniform.h"
#include "StimDotGroundDeperspective.h"

// not dot
#include "StimNDotSolid.h"
#include "StimNDotTexture.h"

// Target
#include "StimTargetFixed.h"
#include "StimTargetMoving.h"

//// target


//// generic code for use with stimuli
namespace Stims // Avoid pollution
{
    /** Naming system:
    Stimulus types are uppercase, additional feature suffixes are lowercase
    - No dot worlds:
    - TX: texture                                           (internal ID 0)
    - SO: Solid                                             (internal ID 1)
    - Dot grounds:
    - GU: dot ground uniform density                        (internal ID 25)
    - GZ: dot ground same number of dots at each depth      (internal ID 26)
    - GD: dot ground deperspective                          (internal ID 27)
    - Dot clouds:
    - CU: dot cloud uniform density                         (internal ID 50)
    - CZ: dot cloud same number of dots at each depth       (internal ID 51)
    - Targets:
    - TS: target that is static in the world                (internal ID 75)
    - TM: target that moves with observer                   (internal ID 76)

    // then, for dot stimuli, extra flags can be set through suffixes, where applicable
    - ce: ceiling also (no dot worlds, dot grounds or dot clouds only)
    - object type is specified by (targets, dot grounds or dot clouds only):
    - gp: points (GL_POINT)
    - sp: Spheres (GluSphere)
    - di: Disc (GluDisk)
    - po: Post (GluCylinder)
    - cl: dot grounds with dot positions randomized into a cloud, such that on-screen speeds in the cloud are equated with those of the ground (dot grounds only)
    - ll: limited lifetime dots (dot grounds or dot clouds only)
    - f2/f3: form, with 'f2' for 2D form, and f3 for 3D form (dot grounds or dot clouds only)
    - nx: noise, where x identifies the type of noise (dot grounds or dot clouds only):
    - n1:

    Implementation tip: each id comes as two letters, so parsing is easy

    Parse the whole thing into some struct which specifies which stimulus and which extra features, check for illegal combinations in parser

    When creating instances, dont make all those setters part of the base class, but use dynamic cast to derived pointers, extra safety check
    */

    // stimulus specification parser
    // create stimulus instances
}